package bo;

import IBO.ICodePostal;
import IBO.IZoneGeographique;
import dao.AbstractFactory;
import dao.dto.CodePostalDto;
import dao.dto.ZoneDto;
import boerrors.CodePostalInexistantException;
import boerrors.ZoneMinimumMultiplicityException;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.Util;

public class CodePostal implements ICodePostal, Serializable, Cloneable {
        private int _idCodePostal;
	private String _codePostal;
	private String _ville;
	private String _pays;
        private Zone _zone;
        
	//*******************************************************************
	//Constructeurs
	//*******************************************************************

        public CodePostal(CodePostalDto codePostalDto) throws RemoteException{
                Zone zone = new Zone(codePostalDto.getZone());
                enregistrerZone(zone);
                setIdCodePostal(codePostalDto.getIdCodePostal());
                setCodePostal(codePostalDto.getCodePostal());
                setVille(codePostalDto.getVille());
                setPays(codePostalDto.getPays());
                UnicastRemoteObject.exportObject(this,0);
        }
        
        public CodePostal(int idCodePostal, String codePostal, String ville, String pays, Zone zone) throws RemoteException {
                enregistrerZone(zone);
                setIdCodePostal(idCodePostal);
		setCodePostal(codePostal);
		setVille(ville);          
		setPays(pays);
                UnicastRemoteObject.exportObject(this,0);
        }
        
        public CodePostal(String codePostal, String ville, Zone zone) throws RemoteException {
                enregistrerZone(zone);
                setCodePostal(codePostal);
		setVille(ville);          
		UnicastRemoteObject.exportObject(this,0);
        }
        
	//*******************************************************************
        //Convertir bo - dto
	//*******************************************************************

        public CodePostalDto creerCodePostalDto () throws ZoneMinimumMultiplicityException, RemoteException {
                ZoneDto tampon = new ZoneDto(this.getZone().getIdZone(), this.getZone().getLibelleZone());
                return new CodePostalDto(   this.getIdCodePostal(), this.getCodePostal(), this.getVille(),
                                            this.getPays(),tampon);
        }
        
	//*******************************************************************
	//Setters
	//*******************************************************************
        
        public synchronized void setIdCodePostal(int idCodePostal) {
		Util.checkPositive(idCodePostal);
                this._idCodePostal = idCodePostal;
	}
	        
        public synchronized void setCodePostal(String codePostal) {
		Util.checkString(codePostal);
                this._codePostal = codePostal;
	}
               
	public synchronized void setVille(String ville) {
		Util.checkString(ville);
		this._ville = ville;
	}
        
	public synchronized void setPays(String pays) {
		Util.checkString(pays);
		this._pays = pays;
	}
        
        //*******************************************************************
	//Getters
	//*******************************************************************
	
        public synchronized int getIdCodePostal() throws RemoteException {
		return _idCodePostal;
	}     
        
        public synchronized String getCodePostal() throws RemoteException {
		return _codePostal;
	}
	
       	public synchronized String getVille() throws RemoteException {
		return _ville;
	}
        
       	public synchronized String getPays() throws RemoteException {
		return _pays;
	}
        
        public synchronized IZoneGeographique getZone() throws RemoteException, ZoneMinimumMultiplicityException {
                if (! aUneZoneValide()) throw new ZoneMinimumMultiplicityException();
                return _zone;
        } 
        
	//*******************************************************************
	//Associations
	//*******************************************************************
        
        private synchronized boolean enregistrerZone(Zone zone) {
                if (this._zone == zone) return false;
		if (! peutEnregistrerZone()) return false;
		this._zone = zone;
		return true;
	}

        //Aucune suppression de la zone n'est autorisée

        private synchronized boolean peutEnregistrerZone() {
                return this._zone == null;
	}
        
        public synchronized boolean aUneZoneValide() {
                return this._zone != null;
        }

	//*******************************************************************
	//Méthode Static
	//*******************************************************************
        
        public synchronized static Vector<CodePostal> listerCodePostaux() throws RemoteException, CodePostalInexistantException {
                Vector<CodePostalDto>listeDto = new Vector<CodePostalDto>();
                Vector<CodePostal>listeBo = new Vector<CodePostal>();
                listeDto = AbstractFactory.getInstance().getCodePostalDao().lister();
                for(int i = 0 ; i < listeDto.size() ; i++){
                        Zone zone = new Zone(   ((CodePostalDto)listeDto.get(i)).getZone().getIdZone(),
                                                ((CodePostalDto)listeDto.get(i)).getZone().getLibelleZone());
                        CodePostal codePostal = new CodePostal( ((CodePostalDto)listeDto.get(i)).getIdCodePostal(),
                                                                ((CodePostalDto)listeDto.get(i)).getCodePostal(),
                                                                ((CodePostalDto)listeDto.get(i)).getVille(),
                                                                ((CodePostalDto)listeDto.get(i)).getPays(), zone);
                        listeBo.add(codePostal);
                }
                return listeBo;
        }
        
        public synchronized static Vector<CodePostal> listerCodePostaux(String cp) throws   Exception, CodePostalInexistantException {
                Vector<CodePostalDto>listeDto = new Vector<CodePostalDto>();
                Vector<CodePostal>listeBo = new Vector<CodePostal>();
                listeDto = AbstractFactory.getInstance().getCodePostalDao().rechercher(cp, "");
                for(int i = 0 ; i < listeDto.size() ; i++){
                        Zone zone = new Zone(   ((CodePostalDto)listeDto.get(i)).getZone().getIdZone(),
                                                ((CodePostalDto)listeDto.get(i)).getZone().getLibelleZone());
                        CodePostal codePostal = new CodePostal( ((CodePostalDto)listeDto.get(i)).getIdCodePostal(),
                                                                ((CodePostalDto)listeDto.get(i)).getCodePostal(),
                                                                ((CodePostalDto)listeDto.get(i)).getVille(),
                                                                ((CodePostalDto)listeDto.get(i)).getPays(), zone);
                        listeBo.add(codePostal);
                }
                return listeBo;
        }       
        
        public synchronized static Vector<CodePostal> listerCommunes(String commune) throws Exception, CodePostalInexistantException {
                Vector<CodePostalDto>listeDto = new Vector<CodePostalDto>();
                Vector<CodePostal>listeBo = new Vector<CodePostal>();
                listeDto = AbstractFactory.getInstance().getCodePostalDao().rechercher("", commune);
                for(int i = 0 ; i < listeDto.size() ; i++){
                        Zone zone = new Zone(   ((CodePostalDto)listeDto.get(i)).getZone().getIdZone(),
                                                ((CodePostalDto)listeDto.get(i)).getZone().getLibelleZone());
                        CodePostal codePostal = new CodePostal( ((CodePostalDto)listeDto.get(i)).getIdCodePostal(),
                                                                ((CodePostalDto)listeDto.get(i)).getCodePostal(),
                                                                ((CodePostalDto)listeDto.get(i)).getVille(),
                                                                ((CodePostalDto)listeDto.get(i)).getPays(),zone);
                        listeBo.add(codePostal);
                }
                return listeBo;
        }
        
        public synchronized static CodePostal rechercherCodePostal(String codePostal, String commune) throws    RemoteException,
                                                                                                                CodePostalInexistantException {
                    Vector<CodePostalDto> listeDto = AbstractFactory.getInstance().getCodePostalDao().rechercher(codePostal, commune);
                    Zone zone = new Zone(   ((CodePostalDto)listeDto.get(0)).getZone().getIdZone(),
                                            ((CodePostalDto)listeDto.get(0)).getZone().getLibelleZone());
                    CodePostal cp = new CodePostal( ((CodePostalDto)listeDto.get(0)).getIdCodePostal(),
                                                            ((CodePostalDto)listeDto.get(0)).getCodePostal(),
                                                            ((CodePostalDto)listeDto.get(0)).getVille(),
                                                            ((CodePostalDto)listeDto.get(0)).getPays(),zone);            
                    return cp;
        }

        //*******************************************************************
	//Method Clonable
	//*******************************************************************        
        
        @Override
        public Object clone() {
                CodePostal codePostal = null;
                try {
                    codePostal = (CodePostal) super.clone();
                    codePostal.enregistrerZone((Zone)this.getZone().clone());
                } catch (RemoteException ex) {
                    Logger.getLogger(CodePostal.class.getName()).log(Level.SEVERE, null, ex);
                } catch (CloneNotSupportedException ex) {
                    Logger.getLogger(Adresse.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ZoneMinimumMultiplicityException ex) {
                    Logger.getLogger(CodePostal.class.getName()).log(Level.SEVERE, null, ex);
                }
                return codePostal;
        }        
}